package com.shangma.cn.controller;

import com.shangma.cn.commons.http.AxiosResult;
import com.shangma.cn.commons.page.PageBean;
import com.shangma.cn.commons.utils.FormValidUtils;
import com.shangma.cn.commons.valid.*;
import com.shangma.cn.controller.base.BaseController;
import com.shangma.cn.dto.base.impl.BrandDTO;
import com.shangma.cn.dto.base.impl.MenuDTO;
import com.shangma.cn.entity.base.impl.Brand;
import com.shangma.cn.entity.base.impl.Menu;
import com.shangma.cn.perm.HasPerm;
import com.shangma.cn.query.impl.BrandQuery;
import com.shangma.cn.query.impl.MenuQuery;
import com.shangma.cn.service.BrandService;
import com.shangma.cn.service.MenuService;
import com.shangma.cn.transfer.base.impl.BrandTransfer;
import com.shangma.cn.transfer.base.impl.MenuTransfer;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 开发人员: 辉哥真球帅
 * 联系方式: zhengzhoudaxuevip@163.com
 * 创建时间: 2021/10/7  16:42
 * 文件含义:
 */
@RestController
@RequestMapping("menu")
@RequiredArgsConstructor
public class MenuController extends BaseController {

    /*
     * 前后端分离的时候
     *  前端和后台 可能不是一个人写的
     *
     * 当前端访问后台的接口时
     *       1： 怎么知道请求路径的
     *       2： 怎么知道需要什么参数
     *       3： 怎么知道返回值的
     *
     * 此时我们前后端程序员需要一个接口文档
     *    1: 在线的
     *         swagger2 knife4j
     *
     *
     *    2: 纸质版的 （电子版的）
     *
     *
     *    3： postman
     *
     *
     *
     *
     *
     *
     *
     * */

    public final MenuService menuService;

    public final MenuTransfer menuTransfer;

    /**
     * 分页条件查询
     */
    @GetMapping
    @HasPerm(permSign = "sys:menu:list")
    public AxiosResult<PageBean<MenuDTO>> searchPage(MenuQuery menuQuery) {
        return AxiosResult.success(menuService.searchPage(menuQuery));
    }

    /**
     * 通过id查询
     *
     * @param id
     * @return
     */
    @GetMapping("{id}")
    public AxiosResult<MenuDTO> getById(@PathVariable long id) {
        return AxiosResult.success(menuTransfer.toDTO(menuService.findOne(id)));
    }


    @PostMapping
    @HasPerm(permSign = "sys:menu:add")
    public AxiosResult<Void> add(@RequestBody @Validated(AddGroup.class) Menu menu) {
        if (menu.getMenuType() == 0) {
            //要判断目录规则
            FormValidUtils.valid(menu, DirectoryGroup.class);
        }
        if (menu.getMenuType() == 1) {
            //判断菜单规则
            FormValidUtils.valid(menu, MenuGroup.class);
        }
        if (menu.getMenuType() == 2) {
            //按钮规则
            FormValidUtils.valid(menu, BtnGroup.class);
        }
        return toAjax(menuService.addEntity(menu));
    }

    @PutMapping
    @HasPerm(permSign = "sys:menu:update")
    public AxiosResult<Void> update(@RequestBody @Validated(UpdateGroup.class) Menu menu) {
        return toAjax(menuService.updateEntity(menu));
    }

    @DeleteMapping("{id}")
    public AxiosResult<Void> deleteById(@PathVariable long id) {
        return toAjax(menuService.deleteById(id));
    }

    @DeleteMapping("batch/{ids}")
    @HasPerm(permSign = "sys:menu:delete")
    public AxiosResult<Void> batchDelete(@PathVariable List<Long> ids) {
        return toAjax(menuService.cascadeDeleteChildren(ids.get(0)));
    }

    @GetMapping("parentTree")
    public AxiosResult<List<MenuDTO>> getParentTree() {
        List<MenuDTO> list = menuService.getParentTree();
        return AxiosResult.success(list);
    }



    @GetMapping("allMenuTree")
    public AxiosResult<List<MenuDTO>> allMenuTree() {
        List<MenuDTO> list = menuService.getAllMenuTree();
        return AxiosResult.success(list);
    }


}
